/**
 * 
 */
package gen;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author Kyniek
 * 
 * 
 *
 */
public class Schema
{
	List<Table> tables;
	
	String mapperLocation = "mapper.xml";
	
	private String targetSchema;
	
	private String tmpSchema;
	
	Map<String, Table> tabMap;
	
	public Schema()
	{
		System.out.println("table group");
	}
	
	
	public Schema(List<Table> tabs)
	{
		tables = tabs;
		
		for(Table tab : tables)
		{
			tab.setSchema(this);
		}
		tabMap = new HashMap<String, Table>();
		for(Table tab : tables)
		{
			tabMap.put(tab.getName(), tab);
		}
	}
	
	
	
	public void createTables()
	{
		if(tables != null && tables.size() > 0)
		{
			for(Table tb : tables)
			{
				tb.createTable();
			}
		}
	}	
	
	/**
	 * zapełnia tabelę danymi pierwotnymi oraz generuje klucze główne
	 */
	public void primaryPopulateTables()
	{
		if(tables != null && tables.size() > 0)
		{
			for(Table tb : tables)
			{
				tb.generateRows();
			}
		}
	}
	
	/**
	 * uzupełnia wartości kluczy obcych na podstawie obiektów typu link. Kolumna do uzupełnienia w ten sposób powinna być klasy EmptySource
	 */
	public void populateForeignKeys()
	{
		if(tables != null && tables.size() > 0)
		{
			for(Table tb : tables)
			{
				tb.populateForeignKeys();
			}
		}
	}
	
	/**
	 * Niektóre ze źródeł można generować dopiero po zapełnieniu tabeli danymi pierwotnymi oraz uzupełnieniu kluczy obcych.
	 */
	public void postProcessPopulation()
	{
		if(tables != null && tables.size() > 0)
		{
			for(Table tb : tables)
			{
				tb.postProcessPopulation();
			}
		}
	}

	
	public String getMapperLocation()
	{
		return mapperLocation;
	}

	
	public void setMapperLocation(String mapperLocation)
	{
		this.mapperLocation = mapperLocation;
	}
	
	public Table getTable(String name)
	{
		System.out.println("Table Name to get : " + name);
		System.out.println(tabMap.keySet());
		return tabMap.get(name);
	}


	public String getTargetSchema()
	{
		return targetSchema;
	}


	public void setTargetSchema(String targetSchema)
	{
		this.targetSchema = targetSchema;
	}


	public String getTmpSchema()
	{
		return tmpSchema;
	}


	public void setTmpSchema(String tmpSchema)
	{
		this.tmpSchema = tmpSchema;
	}

}
